// /*
//     model模块：主要负责题库数据的管理，获取题库中相关数据
//     <文件版本的题库：题库中的数据主要采用两种文件存储>
//     a、题目列表（编号、标题、难易程度、cpu限制、memery限制）存储在question.list文件中
//     b、题目的描述存储在desc.txt文件中、题目的预设代码（用户编译框中指定好的代码）存储在head.cc、题目的测试用例存储在tail.cc
//     c、每个题目都有各自b中提到的文件，共同存放在以题目编号命名的文件夹中，两种文件通过题目编号关联
//     d、head.cc和tail.cc最后组合
// */
// #pragma once
// #include <iostream>
// #include <vector>
// #include <string>
// #include <unordered_map>
// #include <utility>
// #include <fstream>
// #include <cassert>
// #include "../util/log.hpp"
// #include "../util/util.hpp"

// using namespace ns_util;

// namespace ns_model
// {
//     typedef struct Item // 题目列表项
//     {
//         std::string number; // 题目编号
//         std::string title;  // 题目标题
//         std::string star;   // 题目难易程度
//         int cpulimit;       // cpu资源
//         int memlimit;       // 内存资源
//     } Item;

//     typedef struct Question // 题目所有信息
//     {
//         Item item;
//         std::string desc; // 题目描述
//         std::string head; // 预设代码
//         std::string tail; // 测试代码
//     } Qusetion;

//     const std::string questions_path = "./questions/"; // 题目列表和题目的详细信息所在路径

//     class Model
//     {
//     private:
//         bool loadAllQuestions()
//         {
//             std::string ques_list_path = questions_path + "questions.list";
//             std::ifstream in(ques_list_path);
//             if (!in.is_open())
//             {
//                 LOG(FATAL) << "questions.list文件打开失败\n";
//                 return false;
//             }

//             Question q;
//             std::string line;
//             std::vector<std::string> tokens;
//             while (getline(in, line))
//             {
//                 // 获取题目列表
//                 StrUtil::splitStr(line, tokens, " ");
//                 if (tokens.size() != 5)
//                 {
//                     LOG(WARNING) << "题目列表读取错误\n";
//                     continue;
//                 }
//                 q.item.number = tokens[0];
//                 q.item.title = tokens[1];
//                 q.item.star = tokens[2];
//                 q.item.cpulimit = stoi(tokens[3]);
//                 q.item.memlimit = stoi(tokens[4]);

//                 // 获取题目内容信息
//                 std::string ques_one_path = questions_path + q.item.number + "/"; // 具体的某一个问题详细内容路径
//                 std::string desc, head, tail;
//                 if (!FileUtil::readFile(ques_one_path + "desc.txt", desc)) // 读取题目描述
//                 {
//                     LOG(ERROR) << "读取题目" << q.item.number << "描述信息失败\n";
//                     return false;
//                 }
//                 if (!FileUtil::readFile(ques_one_path + "head.cc", head)) // 读取预设代码
//                 {
//                     LOG(ERROR) << "读取题目" << q.item.number << "预设代码失败\n";
//                     return false;
//                 }
//                 if (!FileUtil::readFile(ques_one_path + "tail.cc", tail)) // 读完测试代码
//                 {
//                     LOG(ERROR) << "读取题目" << q.item.number << "测试代码失败\n";
//                     return false;
//                 }
//                 q.desc = desc;
//                 q.head = head;
//                 q.tail = tail;

//                 _questions.insert({q.item.number, q});
//             }
//             in.close();
//             return true;
//         }

//     public:
//         Model()
//         {
//             assert(loadAllQuestions());
//             LOG(INFO) << "题库加载成功\n";
//         }
//         ~Model()
//         {
//         }

//         // 获取题目列表
//         bool getQuestionsList(std::vector<Item> &tokens)
//         {
//             if (_questions.empty())
//             {
//                 LOG(ERROR) << "题库空\n";
//                 return false;
//             }
//             for (auto &e : _questions)
//                 tokens.emplace_back(e.second.item);
//             return true;
//         }

//         // 获取具体题目
//         bool getQuestion(const std::string &number, Question &ques)
//         {
//             if (_questions.empty())
//             {
//                 LOG(ERROR) << "题库空\n";
//                 return false;
//             }
//             auto it = _questions.find(number);
//             if (it == _questions.end())
//             {
//                 LOG(WARNING) << "问题不存在\n";
//                 return false;
//             }
//             ques = it->second;
//             return true;
//         }

//     private:
//         std::unordered_map<std::string, Question> _questions; //<题目编号:题目对象>
//     };
// }